在架構圖中,我們可以看到因為 EKS 在 private 環境中,我們必須使用相同 VPC 內的 bastion 來操作他。
這邊要先科普一下 EKS 的權限管理,當我們使用任意權限建立 EKS 的時候,他會自動建立一個預設的 cluster role 跟 service account。注意!這個預設的 cluster role 會跟你建立時所使用的 iam role / iam user 綁在一起。
正常情況下公司可能會是 CI/CD runner 所賦予的角色。
但這次為了 Demo,並沒有建置完整的 CI / CD 環境,所以如果我在 local 直接執行 terraform 建立,他會用我當前的角色 sso role 作為預設最高角色。而正常來說,我們並不會在 bastion 上使用 sso role,所以我們希望有一個固定的 role 作為預設最高權限來進行操作,並將他用成 instance profile 給 bastion。
今天就來分享如何賦予權限
建置前有四個名詞要搞懂
Cluster role / role
ClusterRole 是 Kubernetes 中定義角色的一種方法,用於控制對集群中資源的存取權限,可以跨多個命名空間共享,並可以將其綁定到特定的服務帳戶,以便實現精準的權限控制
Role,僅在單個命名空間內生效
Service Account:Kubernetes 中的Service Account 用於將特定的權限授予應用程式和工作負載。這是一個讓應用程式與 K8s API 進行交互並根據需要進行認證的方式。通常情況下,每個應用程式或命名空間都有自己的服務帳戶,以確保它們只能訪問所需的資源。
OIDC Providers:AWS 提供了 OIDC(OpenID Connect)身份驗證,以便您可以將 AWS IAM 角色與 Kubernetes 的服務帳戶關聯起來。通過將 IAM 角色與 Kubernetes 服務帳戶關聯,您可以確保應用程式在 AWS 中具有適當的存取權限。例如,您可能希望給一個應用提供 Amazon S3 存儲桶的存取權限,而另一個應用則無法訪問 Amazon S3。
aws-auth ConfigMap 是 AWS EKS 中用於將 IAM 使用者和角色與 Kubernetes RBAC 角色相關聯的配置文件。
aws-auth ConfigMap
和 OIDC Providers
在 AWS EKS 中都涉及到身份和訪問管理,但它們分別處理不同方面的認證和授權。以下是它們之間的關係:
即使它們都涉及到 EKS 集群中的身份和訪問管理,但它們實際上解決的是不同層面的問題:
aws-auth ConfigMap
主要用於控制對 EKS 集群本身的訪問,也就是說,哪些 AWS IAM 使用者和角色可以訪問 EKS 集群。OIDC Providers
則通過與 Identity Provider(如 AWS IAM 或其他 IdP)集成,提供統一的身份驗證和授權機制,以控制對 Kubernetes 資源的訪問,例如在 Kubernetes 集群內部運行的應用程式。module "irsa_role" {
source = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
version = "5.30.0"
role_name = "eks-bastion-role-irsa"
allow_self_assume_role = true
oidc_providers = {
one = {
provider_arn = module.eks.oidc_provider_arn
namespace_service_accounts = ["default:default"]
}
}
role_policy_arns = {
AmazonEKS_CNI_Policy = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
additional = aws_iam_policy.custom_eks_policy.arn
}
}
resource "aws_iam_policy" "custom_eks_policy" {
name = "CustomEKSPolicy"
description = "A custom policy for describing EKS clusters"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"configmaps:*"
],
"Resource": "*"
}
]
}
EOF
}